1. R language (R Core Team (2022)
  2. Main article (Adams et al. (2019)
  3. Rmarkdown (Allaire et al. (2021)
  4. GSEA (Subramanian et al. (2005)
  5. Bader gene set (R. A. S. Merico Daniele AND Isserlin (2010)
  6. Hepatitis Article (Kamiza et al. (2022)
  7. Cytoscape (Shannon et al. (2003)
  8. GeneMania (Zuberi et al. (2013))
  9. p53 (Aloni-Grinstein et al. (2018))
  10. Sialic&cancer (Zhou, Yang, and Guan (2020))
  11. Reactome (Gillespie et al. (2021))
  12. Sialytion (Munkley and Scott (2019))
  13. Drugbank (Wishart et al. (2006))
  14. EnrichmentMap (D. Merico et al. (2010))
  15. AutoAnnotte (Kucera et al. (2016))
if (!requireNamespace("GSA", quietly = TRUE)){
  install.packages("GSA")}
if (!requireNamespace("kable", quietly = TRUE)){
  install.packages("kable")}

Introduction: Assignment 1 & Assignment 2

My dataset from GEO (Gene Expression Omnibus) is GSE131222 of Transcriptional control of sub-type switching ensures adaptation and growth of pancreatic cancer. My gene set aims to see the underlying ectopic expression of GLI2 expression in human pancreatic cancer cell lines specifically looking at YAPC cells. Moreover, 1 ug/ml of Dox treatment allowed for over expression analysis of GLI2 by measuring via RNA-seq. on Illumina hiseq 2000. The authors used TopHat and Cufflinks for quality control and later used qRT-PCR along with SYBR Green assays to measure the intensity. By concluding oncogene genes and detecting induced-higher expression values compare to expression values 6 days before, GLI2 regulation of genes associated with basal-like sub-type switching was detected

Firstly, the data set I obtained from GEO was cleaned and filtered based on duplication. The normalized values of genes that are mostly miRNA genes are eliminated from the gene set. There have been instances that one row of expression has multiple genes associated. This was later found out on the second assignment where we believe this did not cause any problem, due to our limited analysis in the first assignment. Later I analyzed the dispersion among treatments of both triplicate controls that contain empty plasmid of GLI2 and experiments that contain inducible GLI2 plasmid! Since there might be a discrepancy among the gene annotation, which can cause a misunderstanding of our later analysis, I validated my HUGO gene symbols. Furthermore, by identifying HUGO symbols that are respective or similar to those that our clean data set contains. I was able to conclude that my data set is clean, contains no duplicates as well as ready for the later analyses which are normalization, differential expression calculation, non-thresholded & thresholded gene enrichment analyses, fold expression based on the fitted model of GLI2 expression set, and finally for the enrichment mapping with post analysis.

Secondly, by preliminary analyzing the differential expression of our data set via heat map I have concluded that there is a strong difference between the treatment of GLI2 and the control cells in terms of their summarized gene expression by the model. Later, by visualizing the p-value distribution I concluded most of the oncogenes referred on the main article are clustered at the specified p-value interval. Later sample clustering summarized the gene expression difference between the treatment and the control genes. Stringently analyzing Lastly, the non-thresholded gene enrichment map both allowed me to observe genes that are passing our permissive FDR values as well as defined the pathways that are found to be associated with oncogenes. These pathways are then altered visualized and used to conclude that by doing all the analysis on assignment 2, I was able to differentiate the genes that are related to sub-type switching (EMT) and those that are not (non-EMT). Finally, I have separated two data from each other and obtained a ranked gene list based additionally. These analyses taught me how to select a data set, clean a data set, normalize it, analyze to what extent the genes are expressed differentially from one another, and see how the genes are interacting genes in a given pathway or a given gene set. Also, finally, validate the author’s conclusion or come up with my conclusion and promote further research in the area. In this final assignment of mine, I will be concluding my analyses with enrichment mapping by using Cytoscape and its apps as well as conservatively gene set.

Part 1: Non-thresholded Gene set Enrichment Analysis

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/GSEA.png")

Figure 1 GSEA running on Pre-ranked Gene List Panel

I have used GSEA (4.3.2) (4) non-thresholded gene set enrichment method. I have used the Bader Lab gene set of Human_GOBP_AllPathways_no_GO_iea_March_01_2021_symbol.gmt including no HUGO symbols and IEA symbols published on March 1, 2021. It was released in 2023 by Human MiSigDB. I used no collapse to remap gene symbols to avoid confusion. 200 max gene size and 15 min gene size to have more stringent values. I used 1000 permutations that allowed for a shorter running time. Therefore, GSEA resulted in more stringent non-EMT values that are shown to be enriched. There are pathways of genes that are known to be involved in apoptosis. This makes sense because, with my previous results that my log CPM is always negative, there are no positive log CPM values. This was my previous hypothesis that almost every gene treated showed higher expression with the treatments the authors did to induce oncogenic roles.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/enrichment.png")

Figure 2 GSEA Enrichment Results: GSE results indicate there are 4703 upregulated gene sets and 38 down regulated gene sets.

Upregulated

  • 12 gene sets < 25% FDR
  • 85 gene sets < 1% p-value
  • 304 gene sets < 5% nominal p-value

Downregulated

  • 4 gene sets < 25 % FDR
  • 9 gene sets < 1% p-value
  • 9 gene sets < 5% p-value
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/neg.png")

Figure 3 Negative Enrichment Results: The top gene set for negative is PHOSPHOLIPASES%HUMANCYC%LIPASYN-PWY with 0 FDR and 0 p-value and-0.65 ES.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/pos.png")

Figure 4 Positive Enrichment Results: The top gene set at the positive gene set is TRANSCRIPTIONAL REGULATION BY SMALL RNAS%REACTOME%R-HSA-5578749.3 with 0.784 FDR-value and 0.001 Nominal p-values and 0.98 ES score.

Comparison of Thresholded vs non-Thresholded

There are pathways of genes that are known to be involved in apoptosis. This makes sense because, with my previous results that my log CPM is always negative, there are no positive log CPM values. This was my previous hypothesis that almost every gene treated showed higher expression with the treatments the authors did to induce oncogenic roles.

Most of the pathways are viral infection pathways. Furthermore, some viruses stimulate pancreas cancer and liver cancer as well such as chronic Hepatitis C and chronic Hepatitis B (6) A significant proportion of these pathways are systematic disease-causing viruses such as Epstein Barr virus and HIV-1 virus. The negative results contain more oncogenic pathways such that the apoptosis and sialic acid synthesis gene sets are more prevalent as opposed to positive. There is the separation of oncogenic pathways between positive and negative. The second assignment gene enrichment results were more clear in terms of gene pathway role. The difference between EMT genes vs non-EMT genes is more apparent in the thresholded analysis. the gene enrichment results in the non-thresholded analysis are more scarce and do not give significantly enriched results. Even though my parameters are stringent, I am not getting pathways that are adequate in terms of their role.

Finally, the quantitative difference between the thresholded and the non-thresholded is the the thresholded analysis has 771 downregulated genes sets that are less than 0.001 p value and there are 1128 upregulated gene sets. The difference between non-threholded and thresholded is high as 4703 upregualted genes (non-thresholded) - 1128 upregulated genes (thresholded) = 3575 gene sets. The downregualted gene set difference is more substantial (733) genesets more in thresholded analysis.

Part 2: Visualize your Gene set Enrichment Analysis in Cytoscape

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/pathway.png")

Figure 5 Preliminary Cytoscape Pathway Enrichment Visualization: Both apoptotic and viral gene set are separated from each other. Mesenchymal apoptotic gene sets are apparent. Both upregualted (Red) and downregualted (Blue) gene sets are observed. This includes the whole enrichment map.

The enrichment map Cytoscape visualization was done by using stringent 0.05 p-value and ver permissive 0.5 FDR values (7) The reason why I used 0.5 for FDR is that. Furthermore, Jaccard + Overlap coefficient 0.375 and combined coefficient 0.5 were used. In total there are 291 nodes (including hidden) and 763 edges (including hidden edges) in the visualization. There are more gene sets that I find to be associated with each other.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/publication.png")

Figure 6 Publication Ready Annotation Figure of Gene Enrichment visualization (7): By annotating and analyzing in terms of positivity and negativity the enrichment visualization showed up regulated gene sets to be collapsed in viral export RNA theme. Most of the down regulated are not associated with one another.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/parameters.png")

Figure 7 Annotation parameters: The Default parameters are used due to small visualization and for proper observation. The annotations fit the model as there is strong evidence of the previous connections among cancer and viral genes indicated.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/cluster.png")

Figure 8 (Extra!)Publication ready figure of Gene Enrichment visualization: Collapsed themes indicate that there is indeed relationship between abortive viral RNA gene sets and the export viral RNA gene set.

Apoptotic gene sets are related to those of viral infection gene sets. This supports the presence of viral effects on pancreas cancer as well as many other cancer types. I created the publication-ready figure by using default parameters of MCL cluster 3 max word per label, minimum word occurrence of 1, and adjacent word bonus of 8 with WordCloud label algorithm. By collapsing the enrichment map I found 24 major themes on my map. I do not observe any novel pathways that appeared after total collapsing.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/sapiens.png")

NA

Figure 9 (Extra!) GeneMania gene enrichment pathway results. Most of the genes are virus related(8)


The complete gene set GeneMania analysis to see if the genes in the respective pathways on the enrichment map are associated. I noted viral genes mostly. The noted node types

 Genemania <- read.csv(file=file.path(getwd(),"data","table_genemania.csv"))
knitr::kable(Genemania, type="html")
EnrichmentMap..Expression gene.name log.score name node.type query.term score shared.name
0.0000 NUP50 -0.4593206 H__sapiens__1_-774733 query NUP50 0.6317127 H__sapiens__1_-774733
0.0000 NUP205 -0.3864459 H__sapiens__1_-782635 query NUP205 0.6794675 H__sapiens__1_-782635
0.0000 RANBP2 -0.6944706 H__sapiens__1_-782386 query RANBP2 0.4993387 H__sapiens__1_-782386
0.0000 TPR -0.4513919 H__sapiens__1_-773361 query TPR 0.6367412 H__sapiens__1_-773361
0.0000 POM121 -0.3202072 H__sapiens__1_-789815 query POM121 0.7259986 H__sapiens__1_-789815
0.0000 NUP88 -0.4133439 H__sapiens__1_-776294 query NUP88 0.6614348 H__sapiens__1_-776294
0.0000 NUP188 -0.4694928 H__sapiens__1_-774764 query NUP188 0.6253193 H__sapiens__1_-774764
0.0000 NUP133 -0.4971920 H__sapiens__1_-773810 query NUP133 0.6082362 H__sapiens__1_-773810
0.0000 RAE1 -0.5025908 H__sapiens__1_-775191 query RAE1 0.6049613 H__sapiens__1_-775191
35.8284 NUP160 -0.4609759 H__sapiens__1_-773223 query NUP160 0.6306679 H__sapiens__1_-773223
0.0000 NUP155 -0.4669676 H__sapiens__1_-776946 query NUP155 0.6269004 H__sapiens__1_-776946
0.0000 NUP54 -0.4274837 H__sapiens__1_-780479 query NUP54 0.6521480 H__sapiens__1_-780479
0.0000 NUP153 -0.5116202 H__sapiens__1_-778335 query NUP153 0.5995235 H__sapiens__1_-778335
0.0000 NUP214 -0.5148612 H__sapiens__1_-778618 query NUP214 0.5975835 H__sapiens__1_-778618
0.0000 SEC13 -0.5645876 H__sapiens__1_-782804 query SEC13 0.5685946 H__sapiens__1_-782804
0.0000 NDC1 -0.1134623 H__sapiens__1_-773535 query NDC1 0.8927378 H__sapiens__1_-773535
0.0000 NUP37 -0.4418337 H__sapiens__1_-774031 query NUP37 0.6428565 H__sapiens__1_-774031
0.0000 AAAS -0.3917891 H__sapiens__1_-774750 query AAAS 0.6758466 H__sapiens__1_-774750
0.0000 NUP85 -0.4620475 H__sapiens__1_-778398 query NUP85 0.6299924 H__sapiens__1_-778398
0.0000 NUP43 -0.4713705 H__sapiens__1_-777773 query NUP43 0.6241463 H__sapiens__1_-777773
0.0000 NUP107 -0.5350951 H__sapiens__1_-776652 query NUP107 0.5856136 H__sapiens__1_-776652
0.0000 NUP93 -0.4014051 H__sapiens__1_-775466 query NUP93 0.6693788 H__sapiens__1_-775466
0.0000 NUP210 -0.3976326 H__sapiens__1_-779292 query NUP210 0.6719089 H__sapiens__1_-779292
0.0000 NUP35 -0.3966731 H__sapiens__1_-783644 query NUP35 0.6725539 H__sapiens__1_-783644
0.0000 NUP62 -0.4904854 H__sapiens__1_-795021 query NUP62 0.6123291 H__sapiens__1_-795021
0.0000 POM121C -0.0841121 H__sapiens__1_-826631 query POM121C 0.9193282 H__sapiens__1_-826631

Part 3: Post Analysis Summary

library(GSA)
gmt_file <- file.path(getwd(),"data",
  "Human_GOBP_AllPathways_no_GO_iea_March_01_2021_symbol.gmt")
capture.output(genesets <-
GSA.read.gmt(gmt_file),file="GSA_file.txt")
Read 18727 records
Read 1270620 items
names(genesets$genesets) <- genesets$geneset.names
knitr::kable(head(genesets$geneset.names), type="html")
x
PROTEIN CITRULLINATION%HUMANCYC%PWY-4921
METHYLGLYOXAL DEGRADATION III%HUMANCYC%PWY-5453
STEARATE BIOSYNTHESIS I (ANIMALS)%HUMANCYC%PWY-5972
TRYPTOPHAN DEGRADATION X (MAMMALIAN, VIA TRYPTAMINE)%HUMANCYC%PWY-6307
CERAMIDE BIOSYNTHESIS%HUMANCYC%PWY3DJ-12
L-SERINE DEGRADATION%HUMANCYC%SERDEG-PWY
NA
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/p53.png")

Figure 10 (Extra!) Signature gene set p53 against all gene sets enriched: Post analysis coefficient of 0.25 Mann-Whitney cut-off (Two-sided) was used. Post-analysis results also show that p63 is mainly involved in reactive oxygen species (ROS) metabolism. ROS are known to be tumour growth promoters which then cause EMT in different human tissues as well as trigger cancer of different type.


The post analysis includes the signature gene set from Bader gene sets (5) of Human symbols of Drugbank approved gene set. p53 is an oncogene and it is involved in many pathways that are known to be causing different types of cancers. P53 is associated with viral pathways as well as some oncogenic pathways. Therefore, it is safe to assume that the viral effect on oncogenic genes for triggering tumours is indeed true.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/NANS.png")

Figure 11 NANS (encircled red) Sialic Acid pathway of Homo sapiens(11)

The sialic acid pathway is one of the pathways that is known to be affecting tumor proliferation, cell growth, cell detachment and as a result metastasis. It is known to be highly expressed by the cancer cell. Moreover, cancer-triggered apoptosis is one of the results of sialic acid. Neu5Ac 9-phosphate synthase (NANS)( encircled red) is an enzyme in sialic acid metabolism.NANS’ role in sialic acid pathways on the figure. Also, glycolipid-bound sialic acids are highly found in cancer cells. Finally, by having high expression levels and visualized on the pathway analysis NANS has the potential to be an oncogene. The role of sialic acid differs as there is an interaction between cancer genes and the viral genes, I do hypothesize that cancer causing viruses are an important factor in high sialic acid levels in pancreas cancer.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/sialicacid.jpg")

Figure 12 Oncogenic role of Sialic acid Metabolism (10)

Part 4: Interpretation and detailed view of results

1.Do the enrichment results support conclusions or mechanism discussed in the original paper? How do these results differ from the results you got from Assignment 2 thresholded methods ?

Yes, the enrichment results support the conclusion. It not only supports the conclusion of EMT genes that are known to be unregulated and found on the positive side of the gene enrichment analysis but also a finding of viral effect. This viral effect on different types of cancer has been discussed in different literature. However, the cancer oncogene p53 has a relationship with oncogenic viral cancer-inducing genes. Further research is required to illustrate both pancreas cancer and much other cancer. The results that we obtained from the thresholded analysis are partly different from what we obtained from the non-thresholded analysis. I am confident that this is due to the gene-set difference as well as experimental errors in data analysis. However, we were lucky to get partial positive results and conclude similarly to the main paper’s conclusion.

2.Can you find evidence, i.e. publications, to support some of the results that you see. How does this evidence support your result ?

  1. discusses p53 manipulation by oncogenic viruses and shows a clear picture of possible non-oncogenic viruses. my analysis results showed clear indications of HIV, E1b(Ebstein Barr virus) effect on cell apoptosis. Also, cellular degradation pathways are partially visualized on my enrichment map. They are also associated with viral metabolic activity such as HIV (shown on the degradation side)(9) Viral activity is then assocaited with sialic acid as this paper discusses and mentions the virus effect on cancer (12)

Conclusion

In the third part of the assignment the post-analysis of the GSEA results allowed to see the direct interaction between different viral cancerous genes. This paves a path for further research in viral effect on the pancreas cancer, by strengthening the conclusion that the authors made. The results from g:Profile and the GSEA correlate in a way that both of these analysis do have similar numbers of genes lower than 1% p-value. This makes sense because both of these analysis indicate the conclusion of hidden viral genes that the author did not show in their analysis.

knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/cancer.jpeg")

Figure 13: Oncogenic role of Sialic acid Metabolism(9)

Reference

Adams, Christina R, Htet Htwe Htwe, Timothy Marsh, Aprilgate L Wang, Megan L Montoya, Lakshmipriya Subbaraj, Aaron D Tward, Nabeel Bardeesy, and Rushika M Perera. 2019. “Transcriptional Control of Subtype Switching Ensures Adaptation and Growth of Pancreatic Cancer.” Elife 8: e45313.
Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, and Richard Iannone. 2021. rmarkdown: Dynamic Documents for R. https://github.com/rstudio/rmarkdown.
Aloni-Grinstein, Ronit, Meital Charni-Natan, Hilla Solomon, and Varda Rotter. 2018. “P53 and the Viral Connection: Back into the Future ‡.” Cancers 10 (6). https://doi.org/10.3390/cancers10060178.
Gillespie, Marc, Bijay Jassal, Ralf Stephan, Marija Milacic, Karen Rothfels, Andrea Senff-Ribeiro, Johannes Griss, et al. 2021. The reactome pathway knowledgebase 2022.” Nucleic Acids Research 50 (D1): D687–92. https://doi.org/10.1093/nar/gkab1028.
Kamiza, Abram Bunya, Segun Fatumo, Mwiza Gideon Singini, Chih-Ching Yeh, and Tinashe Chikowore. 2022. “Hepatitis B Infection Is Causally Associated with Extrahepatic Cancers: A Mendelian Randomization Study.” EBioMedicine 79 (April): 104003.
Kucera, Mike, Ruth Isserlin, Arkady Arkhangorodsky, and Gary D Bader. 2016. “AutoAnnotate: A Cytoscape App for Summarizing Networks with Semantic Annotations.” F1000Research 5: 1717. https://doi.org/10.12688/f1000research.9090.1.
Merico, Daniele, Ruth Isserlin, Oliver Stueker, Andrew Emili, and Gary D Bader. 2010. “Enrichment Map: A Network-Based Method for Gene-Set Enrichment Visualization and Interpretation.” PLoS One 5 (11): e13984.
Merico, Ruth AND Stueker, Daniele AND Isserlin. 2010. “Enrichment Map: A Network-Based Method for Gene-Set Enrichment Visualization and Interpretation.” PLOS ONE 5 (11): 1–12. https://doi.org/10.1371/journal.pone.0013984.
Munkley, Jennifer, and Emma Scott. 2019. “Targeting Aberrant Sialylation to Treat Cancer.” Medicines (Basel) 6 (4).
R Core Team. 2022. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Shannon, Paul, Andrew Markiel, Owen Ozier, Nitin S Baliga, Jonathan T Wang, Daniel Ramage, Nada Amin, Benno Schwikowski, and Trey Ideker. 2003. “Cytoscape: A Software Environment for Integrated Models of Biomolecular Interaction Networks.” Genome Res 13 (11): 2498–2504.
Subramanian, Aravind, Pablo Tamayo, Vamsi K. Mootha, Sayan Mukherjee, Benjamin L. Ebert, Michael A. Gillette, Amanda Paulovich, et al. 2005. “Gene Set Enrichment Analysis: A Knowledge-Based Approach for Interpreting Genome-Wide Expression Profiles.” Proceedings of the National Academy of Sciences 102 (43): 15545–50. https://doi.org/10.1073/pnas.0506580102.
Wishart, David S, Craig Knox, An Chi Guo, Savita Shrivastava, Murtaza Hassanali, Paul Stothard, Zhan Chang, and Jennifer Woolsey. 2006. DrugBank: A Comprehensive Resource for in Silico Drug Discovery and Exploration.” Nucleic Acids Res 34 (Database issue): D668–72.
Zhou, Xiaoman, Ganglong Yang, and Feng Guan. 2020. “Biological Functions and Analytical Strategies of Sialic Acids in Tumor.” Cells 9 (2).
Zuberi, Khalid, Max Franz, Harold Rodriguez, Jason Montojo, Christian Tannus Lopes, Gary D Bader, and Quaid Morris. 2013. GeneMANIA Prediction Server 2013 Update.” Nucleic Acids Res 41 (Web Server issue): W115–22.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCAzIgphdXRob3I6ICJNZXR5dSBNZWxrb255YW4iCmRhdGU6ICIyMDIzLTAzLTI2IgpiaWJsaW9ncmFwaHk6IEEzLmJpYgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwotLS0KMSkgUiBsYW5ndWFnZSAoQHIKMikgTWFpbiBhcnRpY2xlIChAYWRhbXMyMDE5dHJhbnNjcmlwdGlvbmFsCjMpIFJtYXJrZG93biAoQEFsbGFpcmVfcm1hcmtkb3duX0R5bmFtaWNfRG9jdW1lbnRzXzIwMjEKNCkgR1NFQSAoQGRvaToxMC4xMDczL3BuYXMuMDUwNjU4MDEwMgo1KSBCYWRlciBnZW5lIHNldCAoQDEwLjEzNzEvam91cm5hbC5wb25lLjAwMTM5ODQKNikgSGVwYXRpdGlzIEFydGljbGUgKEBLYW1pemEyMDIyLWRvCjcpIEN5dG9zY2FwZSAoQFNoYW5ub24yMDAzLXVvCjgpIEdlbmVNYW5pYSAoQFp1YmVyaTIwMTMtaXUpCjkpIHA1MyAoQGNhbmNlcnMxMDA2MDE3OCkKMTApIFNpYWxpYyZjYW5jZXIgKEBaaG91MjAyMC1raSkKMTEpIFJlYWN0b21lIChAMTAuMTA5My9uYXIvZ2thYjEwMjgpCjEyKSBTaWFseXRpb24gKEBNdW5rbGV5MjAxOS1vaikKMTMpIERydWdiYW5rIChAV2lzaGFydDIwMDYteGQpCjE0KSBFbnJpY2htZW50TWFwIChATWVyaWNvMjAxMC12ZykKMTUpIEF1dG9Bbm5vdHRlIChAUE1JRCkKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZXZhbD1GQUxTRX0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJHU0EiLCBxdWlldGx5ID0gVFJVRSkpewogIGluc3RhbGwucGFja2FnZXMoIkdTQSIpfQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoImthYmxlIiwgcXVpZXRseSA9IFRSVUUpKXsKICBpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZSIpfQpgYGAKCgojIyBJbnRyb2R1Y3Rpb246IEFzc2lnbm1lbnQgMSAmIEFzc2lnbm1lbnQgMgoKICBNeSBkYXRhc2V0IGZyb20gR0VPIChHZW5lIEV4cHJlc3Npb24gT21uaWJ1cykgaXMgR1NFMTMxMjIyIG9mIFRyYW5zY3JpcHRpb25hbCBjb250cm9sIG9mIHN1Yi10eXBlIHN3aXRjaGluZyBlbnN1cmVzIGFkYXB0YXRpb24gYW5kIGdyb3d0aCBvZiBwYW5jcmVhdGljIGNhbmNlci4gTXkgZ2VuZSBzZXQgYWltcyB0byBzZWUgdGhlIHVuZGVybHlpbmcgZWN0b3BpYyBleHByZXNzaW9uIG9mIEdMSTIgZXhwcmVzc2lvbiBpbiBodW1hbiBwYW5jcmVhdGljIGNhbmNlciBjZWxsIGxpbmVzIHNwZWNpZmljYWxseSBsb29raW5nIGF0IFlBUEMgY2VsbHMuIE1vcmVvdmVyLCAxIHVnL21sIG9mIERveCB0cmVhdG1lbnQgYWxsb3dlZCBmb3Igb3ZlciBleHByZXNzaW9uIGFuYWx5c2lzIG9mIEdMSTIgYnkgbWVhc3VyaW5nIHZpYSBSTkEtc2VxLiBvbiBJbGx1bWluYSBoaXNlcSAyMDAwLiBUaGUgYXV0aG9ycyB1c2VkIFRvcEhhdCBhbmQgQ3VmZmxpbmtzIGZvciBxdWFsaXR5IGNvbnRyb2wgYW5kIGxhdGVyIHVzZWQgcVJULVBDUiBhbG9uZyB3aXRoIFNZQlIgR3JlZW4gYXNzYXlzIHRvIG1lYXN1cmUgdGhlIGludGVuc2l0eS4gQnkgY29uY2x1ZGluZyBvbmNvZ2VuZSBnZW5lcyBhbmQgZGV0ZWN0aW5nIGluZHVjZWQtaGlnaGVyIGV4cHJlc3Npb24gdmFsdWVzIGNvbXBhcmUgdG8gIGV4cHJlc3Npb24gdmFsdWVzIDYgZGF5cyBiZWZvcmUsIEdMSTIgcmVndWxhdGlvbiBvZiBnZW5lcyBhc3NvY2lhdGVkIHdpdGggYmFzYWwtbGlrZSBzdWItdHlwZSBzd2l0Y2hpbmcgd2FzIGRldGVjdGVkCiAgCiAgRmlyc3RseSwgdGhlIGRhdGEgc2V0IEkgb2J0YWluZWQgZnJvbSBHRU8gd2FzIGNsZWFuZWQgYW5kIGZpbHRlcmVkIGJhc2VkIG9uIGR1cGxpY2F0aW9uLiBUaGUgbm9ybWFsaXplZCB2YWx1ZXMgb2YgZ2VuZXMgdGhhdCBhcmUgbW9zdGx5IG1pUk5BIGdlbmVzIGFyZSBlbGltaW5hdGVkIGZyb20gdGhlIGdlbmUgc2V0LiBUaGVyZSBoYXZlIGJlZW4gaW5zdGFuY2VzIHRoYXQgb25lIHJvdyBvZiBleHByZXNzaW9uIGhhcyBtdWx0aXBsZSBnZW5lcyBhc3NvY2lhdGVkLiBUaGlzIHdhcyBsYXRlciBmb3VuZCBvdXQgb24gdGhlIHNlY29uZCBhc3NpZ25tZW50IHdoZXJlIHdlIGJlbGlldmUgdGhpcyBkaWQgbm90IGNhdXNlIGFueSBwcm9ibGVtLCBkdWUgdG8gb3VyIGxpbWl0ZWQgYW5hbHlzaXMgaW4gdGhlIGZpcnN0IGFzc2lnbm1lbnQuIExhdGVyIEkgYW5hbHl6ZWQgdGhlIGRpc3BlcnNpb24gYW1vbmcgdHJlYXRtZW50cyBvZiBib3RoIHRyaXBsaWNhdGUgY29udHJvbHMgdGhhdCBjb250YWluIGVtcHR5IHBsYXNtaWQgb2YgR0xJMiBhbmQgZXhwZXJpbWVudHMgdGhhdCBjb250YWluIGluZHVjaWJsZSBHTEkyIHBsYXNtaWQhIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGEgZGlzY3JlcGFuY3kgYW1vbmcgdGhlIGdlbmUgYW5ub3RhdGlvbiwgd2hpY2ggY2FuIGNhdXNlIGEgbWlzdW5kZXJzdGFuZGluZyBvZiBvdXIgbGF0ZXIgYW5hbHlzaXMsIEkgdmFsaWRhdGVkIG15IEhVR08gZ2VuZSBzeW1ib2xzLiBGdXJ0aGVybW9yZSwgYnkgaWRlbnRpZnlpbmcgSFVHTyBzeW1ib2xzIHRoYXQgYXJlIHJlc3BlY3RpdmUgb3Igc2ltaWxhciB0byB0aG9zZSB0aGF0IG91ciBjbGVhbiBkYXRhIHNldCBjb250YWlucy4gSSB3YXMgYWJsZSB0byBjb25jbHVkZSB0aGF0IG15IGRhdGEgc2V0IGlzIGNsZWFuLCBjb250YWlucyBubyBkdXBsaWNhdGVzIGFzIHdlbGwgYXMgcmVhZHkgZm9yIHRoZSBsYXRlciBhbmFseXNlcyB3aGljaCBhcmUgbm9ybWFsaXphdGlvbiwgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gY2FsY3VsYXRpb24sIG5vbi10aHJlc2hvbGRlZCAmIHRocmVzaG9sZGVkIGdlbmUgZW5yaWNobWVudCBhbmFseXNlcywgZm9sZCBleHByZXNzaW9uIGJhc2VkIG9uIHRoZSBmaXR0ZWQgbW9kZWwgb2YgR0xJMiBleHByZXNzaW9uIHNldCwgYW5kIGZpbmFsbHkgZm9yIHRoZSBlbnJpY2htZW50IG1hcHBpbmcgd2l0aCBwb3N0IGFuYWx5c2lzLgogIAogIFNlY29uZGx5LCBieSBwcmVsaW1pbmFyeSBhbmFseXppbmcgdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIG9mIG91ciBkYXRhIHNldCB2aWEgaGVhdCBtYXAgSSBoYXZlIGNvbmNsdWRlZCB0aGF0IHRoZXJlIGlzIGEgc3Ryb25nIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHJlYXRtZW50IG9mIEdMSTIgYW5kIHRoZSBjb250cm9sIGNlbGxzIGluIHRlcm1zIG9mIHRoZWlyIHN1bW1hcml6ZWQgZ2VuZSBleHByZXNzaW9uIGJ5IHRoZSBtb2RlbC4gTGF0ZXIsIGJ5IHZpc3VhbGl6aW5nIHRoZSBwLXZhbHVlIGRpc3RyaWJ1dGlvbiBJIGNvbmNsdWRlZCBtb3N0IG9mIHRoZSBvbmNvZ2VuZXMgcmVmZXJyZWQgb24gdGhlIG1haW4gYXJ0aWNsZSBhcmUgY2x1c3RlcmVkIGF0IHRoZSBzcGVjaWZpZWQgcC12YWx1ZSBpbnRlcnZhbC4gTGF0ZXIgc2FtcGxlIGNsdXN0ZXJpbmcgc3VtbWFyaXplZCB0aGUgZ2VuZSBleHByZXNzaW9uIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHJlYXRtZW50IGFuZCB0aGUgY29udHJvbCBnZW5lcy4gU3RyaW5nZW50bHkgYW5hbHl6aW5nIExhc3RseSwgdGhlIG5vbi10aHJlc2hvbGRlZCBnZW5lIGVucmljaG1lbnQgbWFwIGJvdGggYWxsb3dlZCBtZSB0byBvYnNlcnZlIGdlbmVzIHRoYXQgYXJlIHBhc3Npbmcgb3VyIHBlcm1pc3NpdmUgRkRSIHZhbHVlcyBhcyB3ZWxsIGFzIGRlZmluZWQgdGhlIHBhdGh3YXlzIHRoYXQgYXJlIGZvdW5kIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmNvZ2VuZXMuIFRoZXNlIHBhdGh3YXlzIGFyZSB0aGVuIGFsdGVyZWQgdmlzdWFsaXplZCBhbmQgdXNlZCB0byBjb25jbHVkZSB0aGF0IGJ5IGRvaW5nIGFsbCB0aGUgYW5hbHlzaXMgb24gYXNzaWdubWVudCAyLCBJIHdhcyBhYmxlIHRvIGRpZmZlcmVudGlhdGUgdGhlIGdlbmVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gc3ViLXR5cGUgc3dpdGNoaW5nIChFTVQpIGFuZCB0aG9zZSB0aGF0IGFyZSBub3QgKG5vbi1FTVQpLiBGaW5hbGx5LCBJIGhhdmUgc2VwYXJhdGVkIHR3byBkYXRhIGZyb20gZWFjaCBvdGhlciBhbmQgb2J0YWluZWQgYSByYW5rZWQgZ2VuZSBsaXN0IGJhc2VkIGFkZGl0aW9uYWxseS4KICBUaGVzZSBhbmFseXNlcyB0YXVnaHQgbWUgaG93IHRvIHNlbGVjdCBhIGRhdGEgc2V0LCBjbGVhbiBhIGRhdGEgc2V0LCBub3JtYWxpemUgaXQsIGFuYWx5emUgdG8gd2hhdCBleHRlbnQgdGhlIGdlbmVzIGFyZSBleHByZXNzZWQgZGlmZmVyZW50aWFsbHkgZnJvbSBvbmUgYW5vdGhlciwgYW5kIHNlZSBob3cgdGhlIGdlbmVzIGFyZSBpbnRlcmFjdGluZyBnZW5lcyBpbiBhIGdpdmVuIHBhdGh3YXkgb3IgYSBnaXZlbiBnZW5lIHNldC4gQWxzbywgZmluYWxseSwgdmFsaWRhdGUgdGhlIGF1dGhvcidzIGNvbmNsdXNpb24gb3IgY29tZSB1cCB3aXRoIG15IGNvbmNsdXNpb24gYW5kIHByb21vdGUgZnVydGhlciByZXNlYXJjaCBpbiB0aGUgYXJlYS4gSW4gdGhpcyBmaW5hbCBhc3NpZ25tZW50IG9mIG1pbmUsIEkgd2lsbCBiZSBjb25jbHVkaW5nIG15IGFuYWx5c2VzIHdpdGggZW5yaWNobWVudCBtYXBwaW5nIGJ5IHVzaW5nIEN5dG9zY2FwZSBhbmQgaXRzIGFwcHMgYXMgd2VsbCBhcyBjb25zZXJ2YXRpdmVseSBnZW5lIHNldC4KCiMjIFBhcnQgMTogTm9uLXRocmVzaG9sZGVkIEdlbmUgc2V0IEVucmljaG1lbnQgQW5hbHlzaXMKCgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9tYWMvRGVza3RvcC9CQ0I0MjAvQTNfTWV0eXVNZWxrb255YW4vaW1hZ2VzL0dTRUEucG5nIikKYGBgCgoqKkZpZ3VyZSAxIEdTRUEgcnVubmluZyBvbiBQcmUtcmFua2VkIEdlbmUgTGlzdCBQYW5lbCoqCgpJIGhhdmUgdXNlZCBHU0VBICg0LjMuMikgKDQpIG5vbi10aHJlc2hvbGRlZCBnZW5lIHNldCBlbnJpY2htZW50IG1ldGhvZC4gSSBoYXZlIHVzZWQgdGhlIEJhZGVyIExhYiBnZW5lIHNldCBvZiBIdW1hbl9HT0JQX0FsbFBhdGh3YXlzX25vX0dPX2llYV9NYXJjaF8wMV8yMDIxX3N5bWJvbC5nbXQgaW5jbHVkaW5nIG5vIEhVR08gc3ltYm9scyBhbmQgSUVBIHN5bWJvbHMgcHVibGlzaGVkIG9uIE1hcmNoIDEsIDIwMjEuIEl0IHdhcyByZWxlYXNlZCBpbiAyMDIzIGJ5IEh1bWFuIE1pU2lnREIuIEkgdXNlZCBubyBjb2xsYXBzZSB0byByZW1hcCBnZW5lIHN5bWJvbHMgdG8gYXZvaWQgY29uZnVzaW9uLiAyMDAgbWF4IGdlbmUgc2l6ZSBhbmQgMTUgbWluIGdlbmUgc2l6ZSB0byBoYXZlIG1vcmUgc3RyaW5nZW50IHZhbHVlcy4gSSB1c2VkIDEwMDAgcGVybXV0YXRpb25zIHRoYXQgYWxsb3dlZCBmb3IgYSBzaG9ydGVyIHJ1bm5pbmcgdGltZS4gVGhlcmVmb3JlLCBHU0VBIHJlc3VsdGVkIGluIG1vcmUgc3RyaW5nZW50IG5vbi1FTVQgdmFsdWVzIHRoYXQgYXJlIHNob3duIHRvIGJlIGVucmljaGVkLiBUaGVyZSBhcmUgcGF0aHdheXMgb2YgZ2VuZXMgdGhhdCBhcmUga25vd24gdG8gYmUgaW52b2x2ZWQgaW4gYXBvcHRvc2lzLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UsIHdpdGggbXkgcHJldmlvdXMgcmVzdWx0cyB0aGF0IG15IGxvZyBDUE0gaXMgYWx3YXlzIG5lZ2F0aXZlLCB0aGVyZSBhcmUgbm8gcG9zaXRpdmUgbG9nIENQTSB2YWx1ZXMuIFRoaXMgd2FzIG15IHByZXZpb3VzIGh5cG90aGVzaXMgdGhhdCBhbG1vc3QgZXZlcnkgZ2VuZSB0cmVhdGVkIHNob3dlZCBoaWdoZXIgZXhwcmVzc2lvbiB3aXRoIHRoZSB0cmVhdG1lbnRzIHRoZSBhdXRob3JzIGRpZCB0byBpbmR1Y2Ugb25jb2dlbmljIHJvbGVzLiAKCgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9tYWMvRGVza3RvcC9CQ0I0MjAvQTNfTWV0eXVNZWxrb255YW4vaW1hZ2VzL2VucmljaG1lbnQucG5nIikKYGBgCgoqKkZpZ3VyZSAyIEdTRUEgRW5yaWNobWVudCBSZXN1bHRzOioqIEdTRSByZXN1bHRzIGluZGljYXRlIHRoZXJlIGFyZSA0NzAzIHVwcmVndWxhdGVkIGdlbmUgc2V0cyBhbmQgMzggZG93biByZWd1bGF0ZWQgZ2VuZSBzZXRzLgoKIyMjIyBVcHJlZ3VsYXRlZAoqIDEyIGdlbmUgc2V0cyA8IDI1JSBGRFIKKiA4NSBnZW5lIHNldHMgPCAxJSBwLXZhbHVlCiogMzA0IGdlbmUgc2V0cyA8IDUlIG5vbWluYWwgcC12YWx1ZQoKIyMjIyBEb3ducmVndWxhdGVkCiogNCBnZW5lIHNldHMgPCAyNSAlIEZEUgoqIDkgZ2VuZSBzZXRzIDwgMSUgcC12YWx1ZQoqIDkgZ2VuZSBzZXRzIDwgNSUgcC12YWx1ZQoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9uZWcucG5nIikKYGBgCgoqKkZpZ3VyZSAzIE5lZ2F0aXZlIEVucmljaG1lbnQgUmVzdWx0czoqKiBUaGUgdG9wIGdlbmUgc2V0IGZvciBuZWdhdGl2ZSBpcyBQSE9TUEhPTElQQVNFUyVIVU1BTkNZQyVMSVBBU1lOLVBXWSB3aXRoIDAgRkRSIGFuZCAwIHAtdmFsdWUgYW5kLTAuNjUgRVMuCgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9tYWMvRGVza3RvcC9CQ0I0MjAvQTNfTWV0eXVNZWxrb255YW4vaW1hZ2VzL3Bvcy5wbmciKQpgYGAKCioqRmlndXJlIDQgUG9zaXRpdmUgRW5yaWNobWVudCBSZXN1bHRzOioqIFRoZSB0b3AgZ2VuZSBzZXQgYXQgdGhlIHBvc2l0aXZlIGdlbmUgc2V0IGlzIFRSQU5TQ1JJUFRJT05BTCBSRUdVTEFUSU9OIEJZIFNNQUxMIFJOQVMlUkVBQ1RPTUUlUi1IU0EtNTU3ODc0OS4zIHdpdGggMC43ODQgRkRSLXZhbHVlIGFuZCAwLjAwMSBOb21pbmFsIHAtdmFsdWVzIGFuZCAwLjk4IEVTIHNjb3JlLiAKCiMjIyBDb21wYXJpc29uIG9mIFRocmVzaG9sZGVkIHZzIG5vbi1UaHJlc2hvbGRlZAoKVGhlcmUgYXJlIHBhdGh3YXlzIG9mIGdlbmVzIHRoYXQgYXJlIGtub3duIHRvIGJlIGludm9sdmVkIGluIGFwb3B0b3Npcy4gVGhpcyBtYWtlcyBzZW5zZSBiZWNhdXNlLCB3aXRoIG15IHByZXZpb3VzIHJlc3VsdHMgdGhhdCBteSBsb2cgQ1BNIGlzIGFsd2F5cyBuZWdhdGl2ZSwgdGhlcmUgYXJlIG5vIHBvc2l0aXZlIGxvZyBDUE0gdmFsdWVzLiBUaGlzIHdhcyBteSBwcmV2aW91cyBoeXBvdGhlc2lzIHRoYXQgYWxtb3N0IGV2ZXJ5IGdlbmUgdHJlYXRlZCBzaG93ZWQgaGlnaGVyIGV4cHJlc3Npb24gd2l0aCB0aGUgdHJlYXRtZW50cyB0aGUgYXV0aG9ycyBkaWQgdG8gaW5kdWNlIG9uY29nZW5pYyByb2xlcy4gCgpNb3N0IG9mIHRoZSBwYXRod2F5cyBhcmUgdmlyYWwgaW5mZWN0aW9uIHBhdGh3YXlzLiBGdXJ0aGVybW9yZSwgc29tZSB2aXJ1c2VzIHN0aW11bGF0ZSBwYW5jcmVhcyBjYW5jZXIgYW5kIGxpdmVyIGNhbmNlciBhcyB3ZWxsIHN1Y2ggYXMgY2hyb25pYyBIZXBhdGl0aXMgQyBhbmQgY2hyb25pYyBIZXBhdGl0aXMgQiAoNikgQSBzaWduaWZpY2FudCBwcm9wb3J0aW9uIG9mIHRoZXNlIHBhdGh3YXlzIGFyZSBzeXN0ZW1hdGljIGRpc2Vhc2UtY2F1c2luZyB2aXJ1c2VzIHN1Y2ggYXMgRXBzdGVpbiBCYXJyIHZpcnVzIGFuZCBISVYtMSB2aXJ1cy4gVGhlIG5lZ2F0aXZlIHJlc3VsdHMgY29udGFpbiBtb3JlIG9uY29nZW5pYyBwYXRod2F5cyBzdWNoIHRoYXQgdGhlIGFwb3B0b3NpcyBhbmQgc2lhbGljIGFjaWQgc3ludGhlc2lzIGdlbmUgc2V0cyBhcmUgbW9yZSBwcmV2YWxlbnQgYXMgb3Bwb3NlZCB0byBwb3NpdGl2ZS4gVGhlcmUgaXMgdGhlIHNlcGFyYXRpb24gb2Ygb25jb2dlbmljIHBhdGh3YXlzIGJldHdlZW4gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlLiBUaGUgc2Vjb25kIGFzc2lnbm1lbnQgZ2VuZSBlbnJpY2htZW50IHJlc3VsdHMgd2VyZSBtb3JlIGNsZWFyIGluIHRlcm1zIG9mIGdlbmUgcGF0aHdheSByb2xlLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEVNVCBnZW5lcyB2cyBub24tRU1UIGdlbmVzIGlzIG1vcmUgYXBwYXJlbnQgaW4gdGhlIHRocmVzaG9sZGVkIGFuYWx5c2lzLiB0aGUgZ2VuZSBlbnJpY2htZW50IHJlc3VsdHMgaW4gdGhlIG5vbi10aHJlc2hvbGRlZCBhbmFseXNpcyBhcmUgbW9yZSBzY2FyY2UgYW5kIGRvIG5vdCBnaXZlIHNpZ25pZmljYW50bHkgZW5yaWNoZWQgcmVzdWx0cy4gRXZlbiB0aG91Z2ggbXkgcGFyYW1ldGVycyBhcmUgc3RyaW5nZW50LCBJIGFtIG5vdCBnZXR0aW5nIHBhdGh3YXlzIHRoYXQgYXJlIGFkZXF1YXRlIGluIHRlcm1zIG9mIHRoZWlyIHJvbGUuCgpGaW5hbGx5LCB0aGUgcXVhbnRpdGF0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdGhyZXNob2xkZWQgYW5kIHRoZSBub24tdGhyZXNob2xkZWQgaXMgdGhlIHRoZSB0aHJlc2hvbGRlZCBhbmFseXNpcyBoYXMgNzcxIGRvd25yZWd1bGF0ZWQgZ2VuZXMgc2V0cyB0aGF0IGFyZSBsZXNzIHRoYW4gMC4wMDEgcCB2YWx1ZSBhbmQgdGhlcmUgYXJlIDExMjggdXByZWd1bGF0ZWQgZ2VuZSBzZXRzLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vbi10aHJlaG9sZGVkIGFuZCB0aHJlc2hvbGRlZCBpcyBoaWdoIGFzIDQ3MDMgdXByZWd1YWx0ZWQgZ2VuZXMgKG5vbi10aHJlc2hvbGRlZCkgLSAxMTI4IHVwcmVndWxhdGVkIGdlbmVzICh0aHJlc2hvbGRlZCkgPSAzNTc1IGdlbmUgc2V0cy4gVGhlIGRvd25yZWd1YWx0ZWQgZ2VuZSBzZXQgZGlmZmVyZW5jZSBpcyBtb3JlIHN1YnN0YW50aWFsICg3MzMpIGdlbmVzZXRzIG1vcmUgaW4gdGhyZXNob2xkZWQgYW5hbHlzaXMuIAoKCiMjIFBhcnQgMjogVmlzdWFsaXplIHlvdXIgR2VuZSBzZXQgRW5yaWNobWVudCBBbmFseXNpcyBpbiBDeXRvc2NhcGUKCmBgYHtyfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL21hYy9EZXNrdG9wL0JDQjQyMC9BM19NZXR5dU1lbGtvbnlhbi9pbWFnZXMvcGF0aHdheS5wbmciKQpgYGAKCioqRmlndXJlIDUgUHJlbGltaW5hcnkgQ3l0b3NjYXBlIFBhdGh3YXkgRW5yaWNobWVudCBWaXN1YWxpemF0aW9uOioqIEJvdGggYXBvcHRvdGljIGFuZCB2aXJhbCBnZW5lIHNldCBhcmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlci4gTWVzZW5jaHltYWwgYXBvcHRvdGljIGdlbmUgc2V0cyBhcmUgYXBwYXJlbnQuIEJvdGggdXByZWd1YWx0ZWQgKFJlZCkgYW5kIGRvd25yZWd1YWx0ZWQgKEJsdWUpIGdlbmUgc2V0cyBhcmUgb2JzZXJ2ZWQuIFRoaXMgaW5jbHVkZXMgdGhlIHdob2xlIGVucmljaG1lbnQgbWFwLgoKVGhlIGVucmljaG1lbnQgbWFwIEN5dG9zY2FwZSB2aXN1YWxpemF0aW9uIHdhcyBkb25lIGJ5IHVzaW5nIHN0cmluZ2VudCAwLjA1IHAtdmFsdWUgYW5kIHZlciBwZXJtaXNzaXZlIDAuNSBGRFIgdmFsdWVzICg3KSBUaGUgcmVhc29uIHdoeSBJIHVzZWQgMC41IGZvciBGRFIgaXMgdGhhdC4gRnVydGhlcm1vcmUsIEphY2NhcmQgKyBPdmVybGFwIGNvZWZmaWNpZW50IDAuMzc1IGFuZCBjb21iaW5lZCBjb2VmZmljaWVudCAwLjUgd2VyZSB1c2VkLiBJbiB0b3RhbCB0aGVyZSBhcmUgMjkxIG5vZGVzIChpbmNsdWRpbmcgaGlkZGVuKSBhbmQgNzYzIGVkZ2VzIChpbmNsdWRpbmcgaGlkZGVuIGVkZ2VzKSBpbiB0aGUgdmlzdWFsaXphdGlvbi4gVGhlcmUgYXJlIG1vcmUgZ2VuZSBzZXRzIHRoYXQgSSBmaW5kIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG90aGVyLgoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9wdWJsaWNhdGlvbi5wbmciKQpgYGAKCioqRmlndXJlIDYgUHVibGljYXRpb24gUmVhZHkgQW5ub3RhdGlvbiBGaWd1cmUgb2YgR2VuZSBFbnJpY2htZW50IHZpc3VhbGl6YXRpb24gKDcpKio6IEJ5IGFubm90YXRpbmcgYW5kIGFuYWx5emluZyBpbiB0ZXJtcyBvZiBwb3NpdGl2aXR5IGFuZCBuZWdhdGl2aXR5IHRoZSBlbnJpY2htZW50IHZpc3VhbGl6YXRpb24gc2hvd2VkIHVwIHJlZ3VsYXRlZCBnZW5lIHNldHMgdG8gYmUgY29sbGFwc2VkIGluIHZpcmFsIGV4cG9ydCBSTkEgdGhlbWUuIE1vc3Qgb2YgdGhlIGRvd24gcmVndWxhdGVkIGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIG9uZSBhbm90aGVyLgoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9wYXJhbWV0ZXJzLnBuZyIpCmBgYAoKKipGaWd1cmUgNyBBbm5vdGF0aW9uIHBhcmFtZXRlcnMqKjogVGhlIERlZmF1bHQgcGFyYW1ldGVycyBhcmUgdXNlZCBkdWUgdG8gc21hbGwgdmlzdWFsaXphdGlvbiBhbmQgZm9yIHByb3BlciBvYnNlcnZhdGlvbi4gVGhlIGFubm90YXRpb25zIGZpdCB0aGUgbW9kZWwgYXMgdGhlcmUgaXMgc3Ryb25nIGV2aWRlbmNlIG9mIHRoZSBwcmV2aW91cyBjb25uZWN0aW9ucyBhbW9uZyBjYW5jZXIgYW5kIHZpcmFsIGdlbmVzIGluZGljYXRlZC4KCmBgYHtyfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL21hYy9EZXNrdG9wL0JDQjQyMC9BM19NZXR5dU1lbGtvbnlhbi9pbWFnZXMvY2x1c3Rlci5wbmciKQpgYGAKCioqRmlndXJlIDggKEV4dHJhISlQdWJsaWNhdGlvbiByZWFkeSBmaWd1cmUgb2YgR2VuZSBFbnJpY2htZW50IHZpc3VhbGl6YXRpb24qKjogQ29sbGFwc2VkIHRoZW1lcyBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIGluZGVlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBhYm9ydGl2ZSB2aXJhbCBSTkEgZ2VuZSBzZXRzIGFuZCB0aGUgZXhwb3J0IHZpcmFsIFJOQSBnZW5lIHNldC4KCkFwb3B0b3RpYyBnZW5lIHNldHMgYXJlIHJlbGF0ZWQgdG8gdGhvc2Ugb2YgdmlyYWwgaW5mZWN0aW9uIGdlbmUgc2V0cy4gVGhpcyBzdXBwb3J0cyB0aGUgcHJlc2VuY2Ugb2YgdmlyYWwgZWZmZWN0cyBvbiBwYW5jcmVhcyBjYW5jZXIgYXMgd2VsbCBhcyBtYW55IG90aGVyIGNhbmNlciB0eXBlcy4gSSBjcmVhdGVkIHRoZSBwdWJsaWNhdGlvbi1yZWFkeSBmaWd1cmUgYnkgdXNpbmcgZGVmYXVsdCBwYXJhbWV0ZXJzIG9mIE1DTCBjbHVzdGVyIDMgbWF4IHdvcmQgcGVyIGxhYmVsLCBtaW5pbXVtIHdvcmQgb2NjdXJyZW5jZSBvZiAxLCBhbmQgYWRqYWNlbnQgd29yZCBib251cyBvZiA4IHdpdGggV29yZENsb3VkIGxhYmVsIGFsZ29yaXRobS4gQnkgY29sbGFwc2luZyB0aGUgZW5yaWNobWVudCBtYXAgSSBmb3VuZCAyNCBtYWpvciB0aGVtZXMgb24gbXkgbWFwLiBJIGRvIG5vdCBvYnNlcnZlIGFueSBub3ZlbCBwYXRod2F5cyB0aGF0IGFwcGVhcmVkIGFmdGVyIHRvdGFsIGNvbGxhcHNpbmcuIAoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9zYXBpZW5zLnBuZyIpCgpgYGAKCioqRmlndXJlIDkgKEV4dHJhISkgR2VuZU1hbmlhIGdlbmUgZW5yaWNobWVudCBwYXRod2F5IHJlc3VsdHMuIE1vc3Qgb2YgdGhlIGdlbmVzIGFyZSB2aXJ1cyByZWxhdGVkKDgpKioKCjxicj4gVGhlIGNvbXBsZXRlIGdlbmUgc2V0IEdlbmVNYW5pYSBhbmFseXNpcyB0byBzZWUgaWYgdGhlIGdlbmVzIGluIHRoZSByZXNwZWN0aXZlIHBhdGh3YXlzIG9uIHRoZSBlbnJpY2htZW50IG1hcCBhcmUgYXNzb2NpYXRlZC4gSSBub3RlZCB2aXJhbCBnZW5lcyBtb3N0bHkuIFRoZSBub3RlZCBub2RlIHR5cGVzCgpgYGB7cn0KIEdlbmVtYW5pYSA8LSByZWFkLmNzdihmaWxlPWZpbGUucGF0aChnZXR3ZCgpLCJkYXRhIiwidGFibGVfZ2VuZW1hbmlhLmNzdiIpKQprbml0cjo6a2FibGUoR2VuZW1hbmlhLCB0eXBlPSJodG1sIikKYGBgCgojIyBQYXJ0IDM6IFBvc3QgQW5hbHlzaXMgU3VtbWFyeQpgYGB7cn0KbGlicmFyeShHU0EpCmdtdF9maWxlIDwtIGZpbGUucGF0aChnZXR3ZCgpLCJkYXRhIiwKICAiSHVtYW5fR09CUF9BbGxQYXRod2F5c19ub19HT19pZWFfTWFyY2hfMDFfMjAyMV9zeW1ib2wuZ210IikKY2FwdHVyZS5vdXRwdXQoZ2VuZXNldHMgPC0KR1NBLnJlYWQuZ210KGdtdF9maWxlKSxmaWxlPSJHU0FfZmlsZS50eHQiKQpuYW1lcyhnZW5lc2V0cyRnZW5lc2V0cykgPC0gZ2VuZXNldHMkZ2VuZXNldC5uYW1lcwprbml0cjo6a2FibGUoaGVhZChnZW5lc2V0cyRnZW5lc2V0Lm5hbWVzKSwgdHlwZT0iaHRtbCIpCgpgYGAKCmBgYHtyfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL21hYy9EZXNrdG9wL0JDQjQyMC9BM19NZXR5dU1lbGtvbnlhbi9pbWFnZXMvcDUzLnBuZyIpCmBgYAoKKipGaWd1cmUgMTAgKEV4dHJhISkgU2lnbmF0dXJlIGdlbmUgc2V0IHA1MyBhZ2FpbnN0IGFsbCBnZW5lIHNldHMgZW5yaWNoZWQ6KiogUG9zdCBhbmFseXNpcyBjb2VmZmljaWVudCBvZiAwLjI1IE1hbm4tV2hpdG5leSBjdXQtb2ZmIChUd28tc2lkZWQpIHdhcyB1c2VkLiBQb3N0LWFuYWx5c2lzIHJlc3VsdHMgYWxzbyBzaG93IHRoYXQgcDYzIGlzIG1haW5seSBpbnZvbHZlZCBpbiByZWFjdGl2ZSBveHlnZW4gc3BlY2llcyAoUk9TKSBtZXRhYm9saXNtLiBST1MgYXJlIGtub3duIHRvIGJlIHR1bW91ciBncm93dGggcHJvbW90ZXJzIHdoaWNoIHRoZW4gY2F1c2UgRU1UIGluIGRpZmZlcmVudCBodW1hbiB0aXNzdWVzIGFzIHdlbGwgYXMgdHJpZ2dlciBjYW5jZXIgb2YgZGlmZmVyZW50IHR5cGUuCgoKPGJyPiBUaGUgcG9zdCBhbmFseXNpcyBpbmNsdWRlcyB0aGUgc2lnbmF0dXJlIGdlbmUgc2V0IGZyb20gQmFkZXIgZ2VuZSBzZXRzICg1KSAgb2YgSHVtYW4gc3ltYm9scyBvZiBEcnVnYmFuayBhcHByb3ZlZCBnZW5lIHNldC4gcDUzIGlzIGFuIG9uY29nZW5lIGFuZCBpdCBpcyBpbnZvbHZlZCBpbiBtYW55IHBhdGh3YXlzIHRoYXQgYXJlIGtub3duIHRvIGJlIGNhdXNpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGNhbmNlcnMuIFA1MyBpcyBhc3NvY2lhdGVkIHdpdGggdmlyYWwgcGF0aHdheXMgYXMgd2VsbCBhcyBzb21lIG9uY29nZW5pYyBwYXRod2F5cy4gVGhlcmVmb3JlLCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0IHRoZSB2aXJhbCBlZmZlY3Qgb24gb25jb2dlbmljIGdlbmVzIGZvciB0cmlnZ2VyaW5nIHR1bW91cnMgaXMgaW5kZWVkIHRydWUuIAoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9OQU5TLnBuZyIpCmBgYAoKCioqRmlndXJlIDExIE5BTlMgKGVuY2lyY2xlZCByZWQpIFNpYWxpYyBBY2lkIHBhdGh3YXkgb2YgSG9tbyBzYXBpZW5zKDExKSoqCgoKVGhlIHNpYWxpYyBhY2lkIHBhdGh3YXkgaXMgb25lIG9mIHRoZSBwYXRod2F5cyB0aGF0IGlzIGtub3duIHRvIGJlIGFmZmVjdGluZyB0dW1vciBwcm9saWZlcmF0aW9uLCBjZWxsIGdyb3d0aCwgY2VsbCBkZXRhY2htZW50IGFuZCBhcyBhIHJlc3VsdCBtZXRhc3Rhc2lzLiBJdCBpcyBrbm93biB0byBiZSBoaWdobHkgZXhwcmVzc2VkIGJ5IHRoZSBjYW5jZXIgY2VsbC4gTW9yZW92ZXIsIGNhbmNlci10cmlnZ2VyZWQgYXBvcHRvc2lzIGlzIG9uZSBvZiB0aGUgcmVzdWx0cyBvZiBzaWFsaWMgYWNpZC4gTmV1NUFjIDktcGhvc3BoYXRlIHN5bnRoYXNlIChOQU5TKSggZW5jaXJjbGVkIHJlZCkgaXMgYW4gZW56eW1lIGluIHNpYWxpYyBhY2lkIG1ldGFib2xpc20uTkFOUycgcm9sZSBpbiBzaWFsaWMgYWNpZCBwYXRod2F5cyBvbiB0aGUgZmlndXJlLiBBbHNvLCBnbHljb2xpcGlkLWJvdW5kIHNpYWxpYyBhY2lkcyBhcmUgaGlnaGx5IGZvdW5kIGluIGNhbmNlciBjZWxscy4gRmluYWxseSwgYnkgaGF2aW5nIGhpZ2ggZXhwcmVzc2lvbiBsZXZlbHMgYW5kIHZpc3VhbGl6ZWQgb24gdGhlIHBhdGh3YXkgYW5hbHlzaXMgTkFOUyBoYXMgdGhlIHBvdGVudGlhbCB0byBiZSBhbiBvbmNvZ2VuZS4gVGhlIHJvbGUgb2Ygc2lhbGljIGFjaWQgZGlmZmVycyBhcyB0aGVyZSBpcyBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIGNhbmNlciBnZW5lcyBhbmQgdGhlIHZpcmFsIGdlbmVzLCBJIGRvIGh5cG90aGVzaXplIHRoYXQgY2FuY2VyIGNhdXNpbmcgdmlydXNlcyBhcmUgYW4gaW1wb3J0YW50IGZhY3RvciBpbiBoaWdoIHNpYWxpYyBhY2lkIGxldmVscyBpbiBwYW5jcmVhcyBjYW5jZXIuCgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9tYWMvRGVza3RvcC9CQ0I0MjAvQTNfTWV0eXVNZWxrb255YW4vaW1hZ2VzL3NpYWxpY2FjaWQuanBnIikKYGBgCgoqKkZpZ3VyZSAxMiBPbmNvZ2VuaWMgcm9sZSBvZiBTaWFsaWMgYWNpZCBNZXRhYm9saXNtICgxMCkqKgoKIyMgUGFydCA0OiBJbnRlcnByZXRhdGlvbiBhbmQgZGV0YWlsZWQgdmlldyBvZiByZXN1bHRzCgoxLkRvIHRoZSBlbnJpY2htZW50IHJlc3VsdHMgc3VwcG9ydCBjb25jbHVzaW9ucyBvciBtZWNoYW5pc20gZGlzY3Vzc2VkIGluIHRoZSBvcmlnaW5hbCBwYXBlcj8gSG93IGRvIHRoZXNlIHJlc3VsdHMgZGlmZmVyIGZyb20gdGhlIHJlc3VsdHMgeW91IGdvdCBmcm9tIEFzc2lnbm1lbnQgMiB0aHJlc2hvbGRlZCBtZXRob2RzID8KCiAgWWVzLCB0aGUgZW5yaWNobWVudCByZXN1bHRzIHN1cHBvcnQgdGhlIGNvbmNsdXNpb24uIEl0IG5vdCBvbmx5IHN1cHBvcnRzIHRoZSBjb25jbHVzaW9uIG9mIEVNVCBnZW5lcyB0aGF0IGFyZSBrbm93biB0byBiZSB1bnJlZ3VsYXRlZCBhbmQgZm91bmQgb24gdGhlIHBvc2l0aXZlIHNpZGUgb2YgdGhlIGdlbmUgZW5yaWNobWVudCBhbmFseXNpcyBidXQgYWxzbyBhIGZpbmRpbmcgb2YgdmlyYWwgZWZmZWN0LiBUaGlzIHZpcmFsIGVmZmVjdCBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgY2FuY2VyIGhhcyBiZWVuIGRpc2N1c3NlZCBpbiBkaWZmZXJlbnQgbGl0ZXJhdHVyZS4gSG93ZXZlciwgdGhlIGNhbmNlciBvbmNvZ2VuZSBwNTMgaGFzIGEgcmVsYXRpb25zaGlwIHdpdGggb25jb2dlbmljIHZpcmFsIGNhbmNlci1pbmR1Y2luZyBnZW5lcy4gRnVydGhlciByZXNlYXJjaCBpcyByZXF1aXJlZCB0byBpbGx1c3RyYXRlIGJvdGggcGFuY3JlYXMgY2FuY2VyIGFuZCBtdWNoIG90aGVyIGNhbmNlci4gVGhlIHJlc3VsdHMgdGhhdCB3ZSBvYnRhaW5lZCBmcm9tIHRoZSB0aHJlc2hvbGRlZCBhbmFseXNpcyBhcmUgcGFydGx5IGRpZmZlcmVudCBmcm9tIHdoYXQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgbm9uLXRocmVzaG9sZGVkIGFuYWx5c2lzLiBJIGFtIGNvbmZpZGVudCB0aGF0IHRoaXMgaXMgZHVlIHRvIHRoZSBnZW5lLXNldCBkaWZmZXJlbmNlIGFzIHdlbGwgYXMgZXhwZXJpbWVudGFsIGVycm9ycyBpbiBkYXRhIGFuYWx5c2lzLiBIb3dldmVyLCB3ZSB3ZXJlIGx1Y2t5IHRvIGdldCBwYXJ0aWFsIHBvc2l0aXZlIHJlc3VsdHMgYW5kIGNvbmNsdWRlIHNpbWlsYXJseSB0byB0aGUgbWFpbiBwYXBlcidzIGNvbmNsdXNpb24uCgoyLkNhbiB5b3UgZmluZCBldmlkZW5jZSwgaS5lLiBwdWJsaWNhdGlvbnMsIHRvIHN1cHBvcnQgc29tZSBvZiB0aGUgcmVzdWx0cyB0aGF0IHlvdSBzZWUuIEhvdyBkb2VzIHRoaXMgZXZpZGVuY2Ugc3VwcG9ydCB5b3VyIHJlc3VsdCA/CiAgCig5KSBkaXNjdXNzZXMgcDUzIG1hbmlwdWxhdGlvbiBieSBvbmNvZ2VuaWMgdmlydXNlcyBhbmQgc2hvd3MgYSBjbGVhciBwaWN0dXJlIG9mIHBvc3NpYmxlIG5vbi1vbmNvZ2VuaWMgdmlydXNlcy4gbXkgYW5hbHlzaXMgcmVzdWx0cyBzaG93ZWQgY2xlYXIgaW5kaWNhdGlvbnMgb2YgSElWLCBFMWIoRWJzdGVpbiBCYXJyIHZpcnVzKSBlZmZlY3Qgb24gY2VsbCBhcG9wdG9zaXMuIEFsc28sIGNlbGx1bGFyIGRlZ3JhZGF0aW9uIHBhdGh3YXlzIGFyZSBwYXJ0aWFsbHkgdmlzdWFsaXplZCBvbiBteSBlbnJpY2htZW50IG1hcC4gVGhleSBhcmUgYWxzbyBhc3NvY2lhdGVkIHdpdGggdmlyYWwgbWV0YWJvbGljIGFjdGl2aXR5IHN1Y2ggYXMgSElWIChzaG93biBvbiB0aGUgZGVncmFkYXRpb24gc2lkZSkoOSkKVmlyYWwgYWN0aXZpdHkgaXMgdGhlbiBhc3NvY2FpdGVkIHdpdGggc2lhbGljIGFjaWQgYXMgdGhpcyBwYXBlciBkaXNjdXNzZXMgYW5kIG1lbnRpb25zIHRoZSB2aXJ1cyBlZmZlY3Qgb24gY2FuY2VyICgxMikKCiMjIyMgQ29uY2x1c2lvbgoKSW4gdGhlIHRoaXJkIHBhcnQgb2YgdGhlIGFzc2lnbm1lbnQgdGhlIHBvc3QtYW5hbHlzaXMgb2YgdGhlIEdTRUEgcmVzdWx0cyBhbGxvd2VkIHRvIHNlZSB0aGUgZGlyZWN0IGludGVyYWN0aW9uIGJldHdlZW4gZGlmZmVyZW50IHZpcmFsIGNhbmNlcm91cyBnZW5lcy4gVGhpcyBwYXZlcyBhIHBhdGggZm9yIGZ1cnRoZXIgcmVzZWFyY2ggaW4gdmlyYWwgZWZmZWN0IG9uIHRoZSBwYW5jcmVhcyBjYW5jZXIsIGJ5IHN0cmVuZ3RoZW5pbmcgdGhlIGNvbmNsdXNpb24gdGhhdCB0aGUgYXV0aG9ycyBtYWRlLiBUaGUgcmVzdWx0cyBmcm9tIGc6UHJvZmlsZSBhbmQgdGhlIEdTRUEgY29ycmVsYXRlIGluIGEgd2F5IHRoYXQgYm90aCBvZiB0aGVzZSBhbmFseXNpcyBkbyBoYXZlIHNpbWlsYXIgbnVtYmVycyBvZiBnZW5lcyBsb3dlciB0aGFuIDElIHAtdmFsdWUuIFRoaXMgbWFrZXMgc2Vuc2UgYmVjYXVzZSBib3RoIG9mIHRoZXNlIGFuYWx5c2lzIGluZGljYXRlIHRoZSBjb25jbHVzaW9uIG9mIGhpZGRlbiB2aXJhbCBnZW5lcyB0aGF0IHRoZSBhdXRob3IgZGlkIG5vdCBzaG93IGluIHRoZWlyIGFuYWx5c2lzLgoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9jYW5jZXIuanBlZyIpCmBgYAoKKipGaWd1cmUgMTM6IE9uY29nZW5pYyByb2xlIG9mIFNpYWxpYyBhY2lkIE1ldGFib2xpc20oOSkqKgoKCgojIyBSZWZlcmVuY2U=